{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "fd29da6a",
   "metadata": {},
   "source": [
    "# 实验四  Jupyter Notebook实践\n",
    "\n",
    "[Anaconda](https://so.csdn.net/so/search?q=Anaconda&spm=1001.2101.3001.7020)是安装Jupyter Notebook的最佳方式。安装完成之后，启动Anaconda的Navigator，并启动Notebook，呈现如下界面：\n",
    "\n",
    "![image-20220513153300318](https://gitee.com/deer-guide/my-drawing-bed/raw/master/image-20220513153300318.png)\n",
    "\n",
    "观察页面，可以看到浏览器中显示类似`https://localhost:8888/tree.`的网址，代表本地运行着Notebook的服务器。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "876f4ed6",
   "metadata": {},
   "source": [
    "## 创建一个新的Notebook\n",
    "\n",
    "新建一个Notebook Python 3 (ipykernel)，生成了一个`Untitled.ipynb`文件。`.ipynb`文件即所谓的一个Notebook，实际是基于JSON格式的文本文件，并且包含元数据(“Edit > Edit Notebook Metadata”)。新建的Notebook的界面大致如下：\n",
    "\n",
    "![image-20220513153411275](https://gitee.com/deer-guide/my-drawing-bed/raw/master/image-20220513153411275.png)\n",
    "\n",
    "这里有两个关键元素cell和kernal\n",
    "\n",
    "- cell: 文本或者代码执行单元，由kernel执行。\n",
    "- kernel: 计算引擎，执行cell的文本或者代码，本文基于Python 3 ipykernel引擎。\n",
    "\n",
    "## cell\n",
    "\n",
    "主要包含两种类型的cell：\n",
    "\n",
    "- 代码cell：包含可被kernel执行的代码，执行之后在下方显示输出。\n",
    "- Markdown cell：书写Markdown标记语言的cell。\n",
    "\n",
    "试着输入一行代码，查看执行效果："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "f48c79f5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hello World!\n"
     ]
    }
   ],
   "source": [
    "print('Hello World!')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "51afa00a",
   "metadata": {},
   "source": [
    "![image-20220513153550053](https://gitee.com/deer-guide/my-drawing-bed/raw/master/image-20220513153550053.png)\n",
    "\n",
    "代码执行之后，cell左侧的标签从`In [ ]` 变成了 `In [1]`。`In`代表输入，`[]`中的数字代表kernel执行的顺序，而`In [*]`则表示代码cell正在执行代码。以下例子显示了短暂的`In [*]`过程。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "5f5f816f",
   "metadata": {},
   "outputs": [],
   "source": [
    "import time\n",
    "time.sleep(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d4068663",
   "metadata": {},
   "source": [
    "![image-20220513153608373](https://gitee.com/deer-guide/my-drawing-bed/raw/master/image-20220513153608373.png)\n",
    "\n",
    "然后变成了\n",
    "\n",
    "![image-20220513153624763](https://gitee.com/deer-guide/my-drawing-bed/raw/master/image-20220513153624763.png)\n",
    "\n",
    "### cell模式\n",
    "\n",
    "有两种模式，编辑模式（edit mode）和命名模式（command mode）\n",
    "\n",
    "- 编辑模式：enter健切换，绿色轮廓![image-20220513153805077](https://gitee.com/deer-guide/my-drawing-bed/raw/master/image-20220513153805077.png)\n",
    "- 命令模式：esc健切换，蓝色轮廓![image-20220513153740904](https://gitee.com/deer-guide/my-drawing-bed/raw/master/image-20220513153740904.png)\n",
    "\n",
    "### 快捷键\n",
    "\n",
    "使用`Ctrl + Shift + P`命令可以查看所有Notebook支持的命令。\n",
    "\n",
    "![image-20220513153931928](https://gitee.com/deer-guide/my-drawing-bed/raw/master/202205131539084.png)\n",
    "\n",
    "在命名模式下，一些快捷键将十分有帮助\n",
    "\n",
    "- 上下键头可以上下cell移动\n",
    "- A 或者 B在上方或者下方插入一个cell\n",
    "- M 将转换活动cell为Markdown cell\n",
    "- Y 将设置活动cell为代码 cell\n",
    "- D+D（两次）删除cell\n",
    "- Z 撤销删除\n",
    "- H 打开所有快捷键的说明\n",
    "\n",
    "在编辑模式，`Ctrl + Shift + -`将以光标处作为分割点，将cell一分为二。\n",
    "\n",
    "![image-20220513154043987](https://gitee.com/deer-guide/my-drawing-bed/raw/master/202205131540078.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "df82b571",
   "metadata": {},
   "outputs": [],
   "source": [
    "import time"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "c71d6969",
   "metadata": {},
   "outputs": [],
   "source": [
    "time.sleep(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "34e44429",
   "metadata": {},
   "source": [
    "## Kernel\n",
    "\n",
    "每个notebook都基于一个内核运行，当执行cell代码时，代码将在内核当中运行，运行的结果会显示在页面上。Kernel中运行的状态在整个文档中是延续的，可以跨越所有的cell。这意思着在一个Notebook某个cell定义的函数或者变量等，在其他cell也可以使用。例如："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "62ec3116",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "def square(x):\n",
    "    return x * x"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a471fbff",
   "metadata": {},
   "source": [
    "执行上述代码cell之后，后续cell可以使用`np`和`square`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "1eee60c1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5 squared is 25\n"
     ]
    }
   ],
   "source": [
    "x = np.random.randint(1, 10)\n",
    "y = square(x)\n",
    "print('%d squared is %d' % (x, y))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6bb65bf2",
   "metadata": {},
   "source": [
    "![image-20220513154231440](https://gitee.com/deer-guide/my-drawing-bed/raw/master/202205131542592.png)\n",
    "\n",
    "注意：Restart Kernal将清空保存在内存中的变量。同时，在浏览器中关闭一个正在运行的notebook页面，并未真正关闭终止Kernel的运行，其还是后台执行。要真正关闭，可选择`File > Close and Halt`，或者`Kernel > Shutdown`。\n",
    "\n",
    "![image-20220513154255143](https://gitee.com/deer-guide/my-drawing-bed/raw/master/202205131542249.png)![image-20220513154312684](https://gitee.com/deer-guide/my-drawing-bed/raw/master/202205131543787.png)\n",
    "\n",
    "以下教程将分两个例子实现基本的Notebook编写，包括简单的Python程序和Python数据分析的例子。首先，重命名文档，更改`Untitled`并输入相关文件名。注意，在写作过程中，常用`Ctrl + S`保存已有的文档。\n",
    "\n",
    "![image-20220513154449179](https://gitee.com/deer-guide/my-drawing-bed/raw/master/202205131544293.png)\n",
    "\n",
    "**重命名为Lab4**\n",
    "\n",
    "# 简单的Python程序的例子\n",
    "\n",
    "本节主要目的掌握[python的基本语法](https://www.runoob.com/python/python-basic-syntax.html)，要求完成基于python的选择排序算法：\n",
    "\n",
    "1. 定义selection_sort函数执行选择排序功能。\n",
    "2. 定义test函数进行测试，执行数据输入，并调用selection_sort函数进行排序，最后输出结果。\n",
    "\n",
    "# 数据分析的例子\n",
    "\n",
    "本例中将分析历年财富世界500强的数据(1955-2005)\n",
    "\n",
    "![image-20220513154551368](https://gitee.com/deer-guide/my-drawing-bed/raw/master/202205131545470.png)\n",
    "\n",
    "之后将该文件放入工作目录：\n",
    "\n",
    "![image-20220513154711569](https://gitee.com/deer-guide/my-drawing-bed/raw/master/202205131547685.png)\n",
    "\n",
    "## 设置\n",
    "\n",
    "导入相关的工具库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "44de0d46",
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b93bdb4e",
   "metadata": {},
   "source": [
    "[pandas](https://pandas.pydata.org/docs/)用于数据处理，[matplotlib](https://so.csdn.net/so/search?q=matplotlib&spm=1001.2101.3001.7020)用于绘图，seaborn使绘图更美观。第一行不是python命令，而被称为line magic。%表示作用与一行，%%表示作用于全文。此处%matplotlib inline 表示使用matlib画图，并将图片输出。\n",
    "\n",
    "随后，加载[数据集](https://so.csdn.net/so/search?q=数据集&spm=1001.2101.3001.7020)。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "465cb0ab",
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_csv('fortune500.csv')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7b48eeef",
   "metadata": {},
   "source": [
    "![image-20220513154756130](https://gitee.com/deer-guide/my-drawing-bed/raw/master/202205131547256.png)\n",
    "\n",
    "## 检查数据集\n",
    "\n",
    "上述代码执行生成的df对象，是pandas常用的数据结构，称为`DataFrame`，可以理解为数据表。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "0be516c2",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Year</th>\n",
       "      <th>Rank</th>\n",
       "      <th>Company</th>\n",
       "      <th>Revenue (in millions)</th>\n",
       "      <th>Profit (in millions)</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1955</td>\n",
       "      <td>1</td>\n",
       "      <td>General Motors</td>\n",
       "      <td>9823.5</td>\n",
       "      <td>806</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1955</td>\n",
       "      <td>2</td>\n",
       "      <td>Exxon Mobil</td>\n",
       "      <td>5661.4</td>\n",
       "      <td>584.8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1955</td>\n",
       "      <td>3</td>\n",
       "      <td>U.S. Steel</td>\n",
       "      <td>3250.4</td>\n",
       "      <td>195.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1955</td>\n",
       "      <td>4</td>\n",
       "      <td>General Electric</td>\n",
       "      <td>2959.1</td>\n",
       "      <td>212.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1955</td>\n",
       "      <td>5</td>\n",
       "      <td>Esmark</td>\n",
       "      <td>2510.8</td>\n",
       "      <td>19.1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Year  Rank           Company  Revenue (in millions) Profit (in millions)\n",
       "0  1955     1    General Motors                 9823.5                  806\n",
       "1  1955     2       Exxon Mobil                 5661.4                584.8\n",
       "2  1955     3        U.S. Steel                 3250.4                195.4\n",
       "3  1955     4  General Electric                 2959.1                212.6\n",
       "4  1955     5            Esmark                 2510.8                 19.1"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "4acd9681",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Year</th>\n",
       "      <th>Rank</th>\n",
       "      <th>Company</th>\n",
       "      <th>Revenue (in millions)</th>\n",
       "      <th>Profit (in millions)</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>25495</th>\n",
       "      <td>2005</td>\n",
       "      <td>496</td>\n",
       "      <td>Wm. Wrigley Jr.</td>\n",
       "      <td>3648.6</td>\n",
       "      <td>493</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25496</th>\n",
       "      <td>2005</td>\n",
       "      <td>497</td>\n",
       "      <td>Peabody Energy</td>\n",
       "      <td>3631.6</td>\n",
       "      <td>175.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25497</th>\n",
       "      <td>2005</td>\n",
       "      <td>498</td>\n",
       "      <td>Wendy's International</td>\n",
       "      <td>3630.4</td>\n",
       "      <td>57.8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25498</th>\n",
       "      <td>2005</td>\n",
       "      <td>499</td>\n",
       "      <td>Kindred Healthcare</td>\n",
       "      <td>3616.6</td>\n",
       "      <td>70.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25499</th>\n",
       "      <td>2005</td>\n",
       "      <td>500</td>\n",
       "      <td>Cincinnati Financial</td>\n",
       "      <td>3614.0</td>\n",
       "      <td>584</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Year  Rank                Company  Revenue (in millions)  \\\n",
       "25495  2005   496        Wm. Wrigley Jr.                 3648.6   \n",
       "25496  2005   497         Peabody Energy                 3631.6   \n",
       "25497  2005   498  Wendy's International                 3630.4   \n",
       "25498  2005   499     Kindred Healthcare                 3616.6   \n",
       "25499  2005   500   Cincinnati Financial                 3614.0   \n",
       "\n",
       "      Profit (in millions)  \n",
       "25495                  493  \n",
       "25496                175.4  \n",
       "25497                 57.8  \n",
       "25498                 70.6  \n",
       "25499                  584  "
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.tail()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "031ebc50",
   "metadata": {},
   "source": [
    "对数据属性列进行重命名，以便在后续访问"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "5b80b0ee",
   "metadata": {},
   "outputs": [],
   "source": [
    "df.columns = ['year', 'rank', 'company', 'revenue', 'profit']"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1f101177",
   "metadata": {},
   "source": [
    "接下来，检查数据条目是否加载完整。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "23cf559d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "25500"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(df)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "63f88507",
   "metadata": {},
   "source": [
    "从1955至2055年总共有25500条目录。然后，检查属性列的类型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "a38ab7be",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "year         int64\n",
       "rank         int64\n",
       "company     object\n",
       "revenue    float64\n",
       "profit      object\n",
       "dtype: object"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.dtypes"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "997d8377",
   "metadata": {},
   "source": [
    "其他属性列都正常，但是对于profit属性，期望的结果是float类型，因此其可能包含非数字的值，利用正则表达式进行检查。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "15a2f32a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>year</th>\n",
       "      <th>rank</th>\n",
       "      <th>company</th>\n",
       "      <th>revenue</th>\n",
       "      <th>profit</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>228</th>\n",
       "      <td>1955</td>\n",
       "      <td>229</td>\n",
       "      <td>Norton</td>\n",
       "      <td>135.0</td>\n",
       "      <td>N.A.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>290</th>\n",
       "      <td>1955</td>\n",
       "      <td>291</td>\n",
       "      <td>Schlitz Brewing</td>\n",
       "      <td>100.0</td>\n",
       "      <td>N.A.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>294</th>\n",
       "      <td>1955</td>\n",
       "      <td>295</td>\n",
       "      <td>Pacific Vegetable Oil</td>\n",
       "      <td>97.9</td>\n",
       "      <td>N.A.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>296</th>\n",
       "      <td>1955</td>\n",
       "      <td>297</td>\n",
       "      <td>Liebmann Breweries</td>\n",
       "      <td>96.0</td>\n",
       "      <td>N.A.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>352</th>\n",
       "      <td>1955</td>\n",
       "      <td>353</td>\n",
       "      <td>Minneapolis-Moline</td>\n",
       "      <td>77.4</td>\n",
       "      <td>N.A.</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     year  rank                company  revenue profit\n",
       "228  1955   229                 Norton    135.0   N.A.\n",
       "290  1955   291        Schlitz Brewing    100.0   N.A.\n",
       "294  1955   295  Pacific Vegetable Oil     97.9   N.A.\n",
       "296  1955   297     Liebmann Breweries     96.0   N.A.\n",
       "352  1955   353     Minneapolis-Moline     77.4   N.A."
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "non_numberic_profits = df.profit.str.contains('[^0-9.-]')\n",
    "df.loc[non_numberic_profits].head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e4482b8c",
   "metadata": {},
   "source": [
    "确实存在这样的记录，profit这一列为字符串，统计一下到底存在多少条这样的记录。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "e20c8127",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "369"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(df.profit[non_numberic_profits])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1a51477b",
   "metadata": {},
   "source": [
    "总体来说，利润（profit）列包含非数字的记录相对来说较少。更进一步，使用直方图显示一下按照年份的分布情况。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "98299330",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "bin_sizes, _, _ = plt.hist(df.year[non_numberic_profits], bins=range(1955, 2006))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "65a178ae",
   "metadata": {},
   "source": [
    "可见，单独年份这样的记录数都少于25条，即少于4%的比例。这在可以接受的范围内，因此删除这些记录。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "5187b703",
   "metadata": {},
   "outputs": [],
   "source": [
    "df = df.loc[~non_numberic_profits]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "c1ca2f2c",
   "metadata": {},
   "outputs": [],
   "source": [
    "df.profit = df.profit.apply(pd.to_numeric)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "28b90f03",
   "metadata": {},
   "source": [
    "再次检查数据记录的条目数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "fcc85e49",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "25131"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "ee3c8338",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "year         int64\n",
       "rank         int64\n",
       "company     object\n",
       "revenue    float64\n",
       "profit     float64\n",
       "dtype: object"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.dtypes"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a2d78bf7",
   "metadata": {},
   "source": [
    "可见，上述操作已经达到清洗无效数据记录的效果。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e88267b4",
   "metadata": {},
   "source": [
    "## 使用matplotlib进行绘图\n",
    "\n",
    "接下来，以年分组绘制平均利润和收入。首先定义变量和方法。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "9e89d0e0",
   "metadata": {},
   "outputs": [],
   "source": [
    "group_by_year = df.loc[:, ['year', 'revenue', 'profit']].groupby('year')\n",
    "avgs = group_by_year.mean()\n",
    "x = avgs.index\n",
    "y1 = avgs.profit\n",
    "def plot(x, y, ax, title, y_label):\n",
    "    ax.set_title(title)\n",
    "    ax.set_ylabel(y_label)\n",
    "    ax.plot(x, y)\n",
    "    ax.margins(x=0, y=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "3e4cbec5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots()\n",
    "plot(x, y1, ax, 'Increase in mean Fortune 500 company profits from 1955 to 2005', 'Profit (millions)')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1d0dd48b",
   "metadata": {},
   "source": [
    "看起来像指数增长，但是1990年代初期出现急剧的下滑，对应当时经济衰退和网络泡沫。再来看看收入曲线。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "c76dc307",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "y2 = avgs.revenue\n",
    "fig, ax = plt.subplots()\n",
    "plot(x, y2, ax, 'Increase in mean Fortune 500 company revenues from 1955 to 2005', 'Revenue (millions)')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cc7b56cf",
   "metadata": {},
   "source": [
    "公司收入曲线并没有出现急剧下降，可能是由于财务会计的处理。对数据结果进行标准差处理。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5c15d4db",
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_with_std(x, y, stds, ax, title, y_label):\n",
    "    ax.fill_between(x, y - stds, y + stds, alpha=0.2)\n",
    "    plot(x, y, ax, title, y_label)\n",
    "fig, (ax1, ax2) = plt.subplots(ncols=2)\n",
    "title = 'Increase in mean and std Fortune 500 company %s from 1955 to 2005'\n",
    "stds1 = group_by_year.std().profit.values\n",
    "stds2 = group_by_year.std().revenue.values\n",
    "plot_with_std(x, y1.values, stds1, ax1, title % 'profits', 'Profit (millions)')\n",
    "plot_with_std(x, y2.values, stds2, ax2, title % 'revenues', 'Revenue (millions)')\n",
    "fig.set_size_inches(14, 4)\n",
    "fig.tight_layout()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cfd24ec5",
   "metadata": {},
   "source": [
    "可见，不同公司之间的收入和利润差距惊人，那么到底前10%和后10%的公司谁的波动更大了？此外，还有很多有价值的信息值得进一步挖掘。\n",
    "# 分享Notebooks\n",
    "\n",
    "分享Notebooks通常来说一般存在两种形式：一种向本文一样以静态非交互式分享（html,markdown,pdf等）；另外一种通过Git版本工具或者[Google Colab](https://colab.research.google.com/)进行协同开发\n",
    "\n",
    "## 分享之前的工作\n",
    "\n",
    "分享的Notebooks应包括代码执行的输出，要保证执行的结果符合预期，需完成以下几件事：\n",
    "\n",
    "- 点击\"Cell > All Output > Clear\"\n",
    "\n",
    "  ![image-20220513155932189](https://gitee.com/deer-guide/my-drawing-bed/raw/master/202205131559358.png)\n",
    "\n",
    "- 点击\"Kernel > Restart & Run All\"\n",
    "\n",
    "  ![image-20220513160008283](https://gitee.com/deer-guide/my-drawing-bed/raw/master/202205131600463.png)\n",
    "\n",
    "- 等待所有代码执行完毕\n",
    "\n",
    "这样做的目的使得Notebook不含有中间的执行结果，按照代码执行的顺序，产生稳定的结果。\n",
    "\n",
    "## 导出Notebooks\n",
    "\n",
    "使用\"File > Download as\"可以以多种格式导出Notebooks，例如：html, pdf, markdown文档等。如果希望以协同方式共享.ipynb，则可以借助相关的在线平台，如[Github](https://github.com/)或者[Google Colab](https://colab.research.google.com/)。\n",
    "\n",
    "# Jupyter Notebook扩展工具\n",
    "\n",
    "Jupter Notebook的扩展工具(extensions)可以提供丰富的附加功能，例如代码补全、内容目录、变量检查等。本节演示如何安装扩展工具和启用代码补全功能。\n",
    "首先Anaconda Navigator中启动命令行终端，\n",
    "\n",
    "![image-20220513150448957](https://gitee.com/deer-guide/my-drawing-bed/raw/master/image-20220513150448957.png)\n",
    "\n",
    "在弹出的终端中依次输入下面4条命令，注意要耐心等待命令执行完成。\n",
    "\n",
    "```bash\n",
    "pip install jupyter_contrib_nbextensions\n",
    "jupyter contrib nbextension install --user\n",
    "pip install jupyter_nbextensions_configurator\n",
    "jupyter nbextensions_configurator enable --user\n",
    "```\n",
    "\n",
    "等待最后一条指令完成即可。\n",
    "\n",
    "![image-20220513152122338](https://gitee.com/deer-guide/my-drawing-bed/raw/master/image-20220513152122338.png)\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "完成之后，重新打开Jupyter Notebook启动页面，可以看到：\n",
    "\n",
    "![image-20220513151315005](https://gitee.com/deer-guide/my-drawing-bed/raw/master/image-20220513151315005.png)\n",
    "\n",
    "点击Nbextensions标签，勾选Hinterland：\n",
    "\n",
    "![image-20220513151434481](https://gitee.com/deer-guide/my-drawing-bed/raw/master/image-20220513151434481.png)\n",
    "\n",
    "接下来可以在notebook进行验证，Tab健可以补全或者选择代码。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
